// import com.alibaba.druid.FastsqlException;
// import com.alibaba.druid.sql.ast.SQLDataType;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
// import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor_ptr;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor_ptr;

// import java.io.IOException;
// import java.util.ArrayList;
// import java.util.List;

#include "OdpsNewExpr.h"
#include <sstream>
#include "../../../../Exception/FastsqlException.h"

OdpsNewExpr::OdpsNewExpr()
{
}

// @Override
SQLObject_ptr OdpsNewExpr::clone()
{
  SQLObject_ptr clone_tmp = std::shared_ptr<OdpsNewExpr>(new OdpsNewExpr());
  std::shared_ptr<OdpsNewExpr> x = std::dynamic_pointer_cast<OdpsNewExpr>(clone_tmp);
  // OdpsNewExpr x = new OdpsNewExpr();
  SQLMethodInvokeExpr::cloneTo(x);
  return x;
}

// @Override
void OdpsNewExpr::accept0(SQLASTVisitor_ptr v)
{
  // accept0((OdpsASTVisitor_ptr) v);
}

// @Override
// voidOdpsNewExpr:: accept0(OdpsASTVisitor_ptr visitor) {
//     if (visitor.visit(this)) {
//         if (this->owner != null) {
//             this->owner.accept(visitor);
//         }

//         for (SQLExpr arg : this->arguments) {
//             if (arg != null) {
//                 arg.accept(visitor);
//             }
//         }

//         if (this->from != null) {
//             this->from.accept(visitor);
//         }

//         if (this->using != null) {
//             this->using.accept(visitor);
//         }

//         if (this->hasFor != null) {
//             this->hasFor.accept(visitor);
//         }

//         visitor.endVisit(this);
//     }
//     visitor.endVisit(this);
// }

void OdpsNewExpr::output(std::stringstream *buf)
{
  try
  {
    (*buf) << "new ";
  }
  catch (const std::exception &e)
  {
    // LOG_INFO << "catch:" << e.what();
    std::string tmp = "output error";
    tmp += e.what();
    throw new FastsqlException(make_string_ptr(tmp));
  }
  SQLMethodInvokeExpr::output(buf);
}

BOOL_ptr OdpsNewExpr::isArray()
{
  return array;
}

void OdpsNewExpr::setArray(BOOL_ptr array)
{
  this->array = array;
}

SQLExpr_list_ptr OdpsNewExpr::getInitValues()
{
  return initValues;
}

SQLDataType_list_ptr OdpsNewExpr::getTypeParameters()
{
  return typeParameters;
}
